package Classes;

import Filtros.Comparadores.Comparador;
import Persistencia.ContactMapper;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;

/**
 *
 * @author Juampi
 */
public class Agenda {

    private static Agenda instance = null;
    private ArrayList<Contacto> contactos;

    private Agenda() {
        contactos = new ArrayList<Contacto>();
    }

    public static Agenda getInstance() { //Singleton
        if (instance == null) {
            instance = new Agenda();
        }
        return instance;
    }

    public boolean addContacto(Contacto contacto) {
        if (ContactMapper.getInstance().insertContact(contacto)) {
            contactos.add(contacto);
            return true;
        } else {
            return false;
        }
    }

    public Contacto ContactoAt(int i) {
        return contactos.get(i);
    }

    public void removeContacto(Contacto contacto) {
        contactos.remove(contacto);
    }

    public void removeContacto(int i) {
        contactos.remove(i);
    }

    public int getCantContactos() {
        return this.contactos.size();
    }

    public void ordenarContactos() {
        Collections.sort(contactos);
    }

    public void inicializarAgenda() {
        this.contactos = ContactMapper.getInstance().getAllContacts();
    }

    /**
     * Filtra los contactos y devuelve una lista con los que pasaron OK por 
     * el filtro
     * @param filtro    El filtro a aplicar. Puede ser un Comparador simple, o un grupo de comparadores, juntados por un OperadorLogico
     * @return La lista filtrada
     */
    public ArrayList<Contacto> filtrarContactos(Comparador filtro) {
        ArrayList<Contacto> filtrados = new ArrayList<Contacto>();

        for (Iterator<Contacto> it = contactos.iterator(); it.hasNext();) {
            Contacto c = it.next();

            if (filtro.Comparar(c)) {
                filtrados.add(c);
            }
        }

        return filtrados;
    }

    public ArrayList<Contacto> getAllContactos() {
        return contactos;
    }

    public boolean saveModified(Contacto contacto) {
        return (ContactMapper.getInstance().updateContact(contacto));
    }

    public boolean deleteContact(Contacto contacto) {
        if (ContactMapper.getInstance().deleteContact(contacto)) {
            this.contactos.remove(contacto);
            return true;
        } else {
            return false;
        }
    }

    /**
     * Genera una lista con las categorias que estan usando las empresas.
     * @return la lista
     */
    public ArrayList<String> getCategoriasUsadas() {
        ArrayList<String> lista = new ArrayList<String>();

        for (Iterator<Contacto> it = getAllContactos().iterator(); it.hasNext();) {
            Contacto contacto = it.next();
            if (contacto.getTipo() == Contacto.ES_EMPRESA) {
                String[] categorias = ((Empresa) contacto).getRubros().split(",");

                for (int i = 0; i < categorias.length; i++) {
                    String categoria = categorias[i].toLowerCase().trim();
                    if (lista.indexOf(categoria) == -1) {
                        lista.add(categoria);
                    }
                }
            }
        }
        return lista;
    }
}
